package com.jdk.demo.thread.scheduledThreadPoolExecutor;

import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Test {

	public static void main(String[] args) {
        // 池中只有一个线程
        ScheduledThreadPoolExecutor schedulePool = new ScheduledThreadPoolExecutor(1);
        // 作为一个周期任务提交,period 为1000ms, 任务执行时间为2000ms
        // 从结果可以看出，任务的周期执行是连着的，没有间隔时间。这是因为任务的运行时间大于周期执行时间，即当任务还没结束时，周期时间已经到了，所以任务刚结束，就可以进行下一周期的执行
        schedulePool.scheduleAtFixedRate(new MyRunnable(), 60, 3600, TimeUnit.SECONDS);
        schedulePool.scheduleAtFixedRate(new MyRunnable(), 56, 3600, TimeUnit.SECONDS);
        schedulePool.scheduleAtFixedRate(new MyRunnable(), 47, 3600, TimeUnit.SECONDS);
        schedulePool.scheduleAtFixedRate(new MyRunnable(), 58, 3600, TimeUnit.SECONDS);
        schedulePool.scheduleAtFixedRate(new MyRunnable(), 43, 3600, TimeUnit.SECONDS);
        schedulePool.scheduleAtFixedRate(new MyRunnable(), 36, 3600, TimeUnit.SECONDS);
    }

    static class MyRunnable implements Runnable {
        int period = 1;

        @Override
        public void run() {
            //为周期任务捕获异常，避免异常影响下一周期的任务执行
            try {
                System.out.println("---------------第 " + period + " 周期-------------");
                System.out.println("begin = " + System.currentTimeMillis() / 1000);//秒
                //任务执行时间
                Thread.sleep(2000);
                System.out.println("end =   " + System.currentTimeMillis() / 1000);
                period++;
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

}
